package controller

import (
	"fmt"
	"github.com/gin-contrib/cors"
	"github.com/gin-gonic/gin"
	"net/http"
	"time"
)

// Server 本地文件服务
type Server struct {
	Base
}

func NewServer() *Server {
	return &Server{}
}

// start 启动时加载
func (s *Server) start(port int) {
	//开启一个文件服务，端口为：10086，则图片访问地址为：http://localhost:10086/preview/xxx.jpg
	go func() {
		//1、文件访问服务
		path := s.pathExist(fmt.Sprintf("%s\\files", s.getAppPath()))
		r := gin.Default()
		r.Use(cors.New(cors.Config{
			AllowAllOrigins:  true,
			AllowMethods:     []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"},
			AllowHeaders:     []string{"*"},
			ExposeHeaders:    []string{"Content-Length", "Authorization", "Content-Type"},
			AllowCredentials: true,
			MaxAge:           12 * time.Hour},
		))
		//GET请求示例
		r.GET("/get", func(c *gin.Context) {
			//假设token失效
			s.log(fmt.Sprintf("Token : %s", c.Request.Header.Get("token")))
			c.JSON(http.StatusOK, s.res(NoLoginCode, "请先登录", nil))
		})
		//GET请求示例
		r.POST("/post", func(c *gin.Context) {
			c.JSON(http.StatusOK, s.success("这个是本地自定义的post请求，你也可以调用第三方API"))
		})
		//本地文件转http文件流
		r.Any("/file", func(c *gin.Context) {
			c.File(c.Query("filename"))
		})
		//文件预览地址
		r.Static("/preview", path)
		//文件上传
		r.POST("/upload", func(c *gin.Context) {
			// 单文件
			file, _ := c.FormFile("file")
			saveName := fmt.Sprintf("%d_%s", time.Now().Unix(), file.Filename)
			dst := fmt.Sprintf("%s\\%s", path, saveName)
			_ = c.SaveUploadedFile(file, dst)
			c.JSON(200, s.success(gin.H{
				"name": file.Filename,                                                 //文件原名称
				"path": saveName,                                                      //保存到数据库的路径
				"url":  fmt.Sprintf("http://localhost:%d/preview/%s", port, saveName), //前端预览地址
				"size": file.Size,                                                     //文件大小
			}))
		})
		_ = r.Run(fmt.Sprintf(":%d", port))
	}()
}
